package dynamicStudy;

public class Rub {

    /**
     * LeetCode T198 打家劫舍
     *
     * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
     *
     * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/house-robber
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param args
     */
    public static void main(String[] args) {

    }

    /**
     * 一维数组+计数
     *
     * 转移方程：该房间是否被抢，如果抢，则此时最大值为上上个房间的最大值+此房间的财务；如果不抢，则此时最大时为上个房间的最大值
     * @param nums
     * @return
     */
    public int rob(int[] nums) {
        //确定状态，计数问题，状态为在每个房子可以抢到的最多钱财，通过最后一步和子问题获得，
        int len = nums.length;
        int[] dp = new int[len + 1]; //默认进行了初始化，所有的值都为0

        //对第一个位置进行初始化
        dp[1] = nums[0];

        //进行循环
        for (int i = 2; i < len + 1; i++){
            dp[i] = Math.max(dp[i - 2] + nums[i - 1], dp[i - 1]);
        }

        return dp[len];
    }


    }
